package ar.edu.frba.utn.dds.Fecha;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;

import ar.edu.frba.utn.dds.Expcetion.ConversionException;

public class Fecha {
	
	final long MILLSECS_PER_DAY = 24 * 60 * 60 * 1000; // Milisegundos al d�a
	private String fecha;
	private Date fechaDate;
	
	public Fecha(String fechaStr) {
		this.fecha = fechaStr;
	}
	
	public Fecha() {
		
	}

	public String getFecha() {
		return fecha;
	}
	public void setFecha(String fecha) {
		this.fecha = fecha;
	}
	public Date getFechaDate() {
		return fechaDate;
	}
	public void setFechaDate(Date fechaDate) {
		this.fechaDate = fechaDate;
	}
	
	/**
	 * Metodo que recibe dos fechas y trata de obtener la diferencia en dias de las mismas
	 * devuelve el valor absoluto de la diferencia
	 * @param fechaInput1
	 * @param fechaInput2
	 * @return
	 * @throws ConversionException 
	 */
	
	public long diasEntreFechas(String fechaInput1, String fechaInput2) throws ConversionException {
		long distanciaEnDias;
		Fecha fecha1 = new Fecha(fechaInput1);
		Fecha fecha2 = new Fecha(fechaInput2);
		Parser parser = new Parser();
		try {
			parser.convertirADate(fecha1, new ArrayList<String>());
		} catch (ParseException e) {
			throw new ConversionException("Imposible parsear la fecha: "
					+ fecha1.getFecha());
		}
		try {
			parser.convertirADate(fecha2, new ArrayList<String>());
		} catch (ParseException e) {
			throw new ConversionException("Imposible parsear la fecha: "
					+ fecha2.getFecha());
		}

		distanciaEnDias = Math.abs((fecha1.getFechaDate().getTime() - fecha2
				.getFechaDate().getTime()) / MILLSECS_PER_DAY);
		return distanciaEnDias;
	}

	/**
	 * Metodo exactamente igual al anterior con la difrencia que puede recibir una lista
	 * con otros formatos posibles de fechas
	 * @param fechaInput1
	 * @param fechaInput2
	 * @param formatosFechas
	 * @return
	 * @throws ConversionException 
	 */
	
	public long diasEntreFechas(String fechaInput1, String fechaInput2,
			ArrayList<String> formatosFechas) throws ConversionException {
		long distanciaEnDias;
		Fecha fecha1 = new Fecha(fechaInput1);
		Fecha fecha2 = new Fecha(fechaInput2);
		Parser parser = new Parser();
		try {
			parser.convertirADate(fecha1, new ArrayList<String>());
		} catch (ParseException e) {
			throw new ConversionException("Imposible parsear la fecha: "
					+ fecha1.getFecha());
		}
		try {
			parser.convertirADate(fecha2, new ArrayList<String>());
		} catch (ParseException e) {
			throw new ConversionException("Imposible parsear la fecha: "
					+ fecha2.getFecha());
		}

		distanciaEnDias = Math.abs((fecha1.getFechaDate().getTime() - fecha2
				.getFechaDate().getTime()) / MILLSECS_PER_DAY);
		return distanciaEnDias;
	}
	
	/**
	 * Metodo que calcula cual de las fechas es la mayor
	 * en caso de no poder pasear lo informa
	 * @param fechaInput1
	 * @param fechaInput2
	 * @return
	 * @throws ConversionException 
	 */
	
	public String mayorFecha(String fechaInput1, String fechaInput2) throws ConversionException {
		Fecha fecha1 = new Fecha(fechaInput1);
		Fecha fecha2 = new Fecha(fechaInput2);
		Parser parser = new Parser();
		try {
			parser.convertirADate(fecha1,new ArrayList<String>());
		}catch (ParseException e) {
			throw new ConversionException("Imposible parsear la fecha: "+fechaInput1);
		}
		try{
			parser.convertirADate(fecha2,new ArrayList<String>());
		}catch (ParseException e) {
			throw new ConversionException("Imposible parsear la fecha: "+fechaInput2);
		}
		return this.comparacionFecha(fecha1, fecha2);
	}
	
	/**
	 * Metodo exactamente igual anterior con la diferencia que puede recibir
	 * una lista con otros posibles formatos de fechas
	 * @param fechaInput1
	 * @param fechaInput2
	 * @param formatosFechas
	 * @return
	 * @throws ConversionException 
	 */
	
	public String mayorFecha(String fechaInput1, String fechaInput2, ArrayList<String> formatosFechas) throws ConversionException {
		Fecha fecha1 = new Fecha(fechaInput1);
		Fecha fecha2 = new Fecha(fechaInput2);
		Parser parser = new Parser();
		try {
			parser.convertirADate(fecha1,formatosFechas);
		}catch (ParseException e) {
			throw new ConversionException("imposible parsear la fecha: "+fecha1.getFecha());
		}
		try{
			parser.convertirADate(fecha2,formatosFechas);
		}catch (ParseException e) {
			throw new ConversionException("imposible parsear la fecha: "+fecha2.getFecha());
		}
		return this.comparacionFecha(fecha1, fecha2);
	}
	
	/**
	 * Metodo que indica cual de las dos fechas es mayor o en caso contrario
	 * dice que son iguales
	 * @param fecha1
	 * @param fecha2
	 * @return
	 */
	
	public String comparacionFecha(Fecha fecha1, Fecha fecha2){
		if (fecha1.getFechaDate().getTime() > fecha2.getFechaDate().getTime()) {
			return "La mayor fecha es: " + fecha1;
		} else if (fecha2.getFechaDate().getTime() < fecha2.getFechaDate().getTime()) {
			return "La mayor fecha es: " + fecha2;
		} else {
			return "Son la misma fecha";
		}
	}
}
